OpenClaw 多 Agent 绑定不同飞书机器人实战教程

背景

最近在配置 OpenClaw 多 Agent 时遇到一个问题:我在 openclaw.json 里添加了多个飞书渠道和多个 Agent,但测试时发现所有消息都被路由到了 main Agent,其他 Agent 根本收不到消息。

排查后发现,问题出在没有配置 bindings

这篇文章记录完整的配置过程,帮你避开这个坑。

问题复现

一开始的配置长这样(简化版):

```json
{
“agents”: {
“list”: [
{ “id”: “main”, “default”: true },
{ “id”: “blog-agent” },
{ “id”: “work-agent” }
]
},
“channels”: {
“feishu”: {
“accounts”: [
{ “id”: “feishu-1”, “appId”: “cli_xxx”, “appSecret”: “xxx” },
{ “id”: “feishu-2”, “appId”: “cli_yyy”, “appSecret”: “yyy” }
]
}
}
}
```

看起来没问题对吧?但实际测试时,不管发给哪个飞书机器人,消息都被 main Agent 接收了。

原因分析

OpenClaw 的路由机制是这样的:

  1. 消息进来 → 识别渠道和发送者
  2. 查找 bindings 配置 → 匹配 Agent
  3. 没有匹配的 binding → 走 default Agent

关键点channels.feishu.accounts[] 只是定义了飞书机器人,但没有告诉 OpenClaw “哪个机器人对应哪个 Agent”。

这个映射关系,需要通过 bindings 来配置。

解决方案:配置 bindings

bindings 是一个数组,每条配置定义一个路由规则:满足什么条件 → 路由到哪个 Agent。

完整配置示例

```json
{
“agents”: {
“list”: [
{ “id”: “main”, “default”: true, “name”: “主助手” },
{ “id”: “blog-agent”, “name”: “博客运营” },
{ “id”: “work-agent”, “name”: “工作助手” }
]
},
“channels”: {
“feishu”: {
“accounts”: [
{ “id”: “feishu-blog”, “appId”: “cli_xxx”, “appSecret”: “xxx” },
{ “id”: “feishu-work”, “appId”: “cli_yyy”, “appSecret”: “yyy” }
]
}
},
“bindings”: [
{
“agentId”: “blog-agent”,
“match”: {
“provider”: “feishu”,
“accountId”: “feishu-blog”
}
},
{
“agentId”: “work-agent”,
“match”: {
“provider”: “feishu”,
“accountId”: “feishu-work”
}
}
]
}
```

配置说明

字段 说明
bindings[].agentId 目标 Agent ID
bindings[].match.provider 渠道类型,飞书是 `feishu`
bindings[].match.accountId 飞书机器人账号 ID,对应 `channels.feishu.accounts[].id`

这样配置后:

  • 发给 feishu-blog 机器人的消息 → 路由到 blog-agent
  • 发给 feishu-work 机器人的消息 → 路由到 work-agent
  • 其他情况 → 走 main(因为是 default)

更精细的匹配

除了按机器人账号匹配,还可以按用户群组匹配:

```json
{
“bindings”: [
{
“agentId”: “blog-agent”,
“match”: {
“provider”: “feishu”,
“accountId”: “feishu-blog”,
“peer”: {
“kind”: “user”,
“id”: “ou_xxx”
}
}
},
{
“agentId”: “work-agent”,
“match”: {
“provider”: “feishu”,
“accountId”: “feishu-work”,
“peer”: {
“kind”: “group”,
“id”: “oc_xxx”
}
}
}
]
}
```

  • peer.kind: `user`(私聊)或 `group`(群聊)
  • peer.id: 用户 Open ID 或群组 ID

这可以实现:同一个机器人,不同用户/群组路由到不同 Agent。

验证配置

配置完成后,用命令验证:

```bash
openclaw agents list –bindings
```

输出会显示每个 Agent 绑定的路由规则。

然后发测试消息,观察日志:

```bash
tail -f ~/.openclaw/logs/gateway.log | grep -E “routing|agent”
```

如果路由正确,会看到类似:

```
[routing] message from feishu:feishu-blog → agent:blog-agent
```

常见问题

Q: 配置了 bindings 但还是走 default?

检查:

  1. match.accountId 是否和 channels.feishu.accounts[].id 一致
  2. JSON 格式是否正确(注意逗号、引号)
  3. 重启 Gateway:`openclaw gateway restart`

Q: 同一个机器人想给不同 Agent 用怎么办?

用 `peer` 匹配,按用户/群组区分:

```json
{
“bindings”: [
{
“agentId”: “agent-a”,
“match”: { “provider”: “feishu”, “accountId”: “my-bot”, “peer”: { “kind”: “user”, “id”: “ou_user_a” } }
},
{
“agentId”: “agent-b”,
“match”: { “provider”: “feishu”, “accountId”: “my-bot”, “peer”: { “kind”: “user”, “id”: “ou_user_b” } }
}
]
}
```

Q: bindings 有优先级吗?

有的,从上到下匹配,第一个匹配生效。把更具体的规则放前面。

小结

OpenClaw 多 Agent 配置的关键点:

  1. `agents.list[]` 定义 Agent 列表
  2. `channels.feishu.accounts[]` 定义飞书机器人
  3. `bindings[]` 定义路由规则:哪个机器人 → 哪个 Agent

漏掉 `bindings`,所有消息都会走 default Agent。配置好之后,就能实现不同飞书机器人对应不同 Agent 的效果。


参考文档:OpenClaw Multi-Agent Routing